🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / core / network / src / androidHostTest / kotlin / org / meshtastic / core / network / repository / UsbManagerTest.kt
Displaying Raw • Download
core/network/src/androidHostTest/kotlin/org/meshtastic/core/network/repository/UsbManagerTest.kt 65a1f5ce4d0e4b8eafcd0bbfccafd41dc6ee888a (65a1f5ce) Text, 8.21 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.network.repository
Tff7b72import T7ee787android.app.Application
Tff7b72import T7ee787android.content.Context
Tff7b72import T7ee787android.content.Intent
Tff7b72import T7ee787android.hardware.usb.UsbDevice
Tff7b72import T7ee787android.hardware.usb.UsbManager
Tff7b72import T7ee787androidx.core.content.ContextCompat
Tff7b72import T7ee787androidx.test.core.app.ApplicationProvider
Tff7b72import T7ee787kotlinx.coroutines.CoroutineStart
Tff7b72import T7ee787kotlinx.coroutines.async
Tff7b72import T7ee787kotlinx.coroutines.flow.first
Tff7b72import T7ee787kotlinx.coroutines.test.runCurrent
Tff7b72import T7ee787kotlinx.coroutines.test.runTest
Tff7b72import T7ee787org.junit.After
Tff7b72import T7ee787org.junit.Test
Tff7b72import T7ee787org.junit.runner.RunWith
Tff7b72import T7ee787org.robolectric.RobolectricTestRunner
Tff7b72import T7ee787org.robolectric.Shadows.shadowOf
Tff7b72import T7ee787org.robolectric.annotation.Config
Tff7b72import T7ee787org.robolectric.shadow.api.Shadow
Tff7b72import T7ee787org.robolectric.util.ReflectionHelpers
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertFalse
Tff7b72import T7ee787kotlin.test.assertTrue
Tf0883e@RunWithTb4b4b4(Te6edf3RobolectricTestRunnerTff7b72::Te6edf3classTb4b4b4)
Tf0883e@ConfigTb4b4b4(Te6edf3sdk Tff7b72= Tff7b72[T79c0ff3T79c0ff4Tff7b72]Tb4b4b4)
Tff7b72class T56d364UsbManagerTest Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3contextTb4b4b4: Te6edf3Context Tff7b72= Te6edf3ApplicationProviderTb4b4b4.Te6edf3getApplicationContextTb4b4b4(Tb4b4b4)
Tf0883e@After
Tff7b72fun Td2a8fftearDownTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3shadowOfTb4b4b4(Te6edf3contextTb4b4b4.Te6edf3applicationContext Tff7b72as Te6edf3ApplicationTb4b4b4)Tb4b4b4.Te6edf3clearRegisteredReceiversTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`permission result receiver is private and ignores a different device`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3requestedDevice Tff7b72= Te6edf3usbDeviceTb4b4b4(Ta5d6ff"Ta5d6ff/dev/bus/usb/001/001Ta5d6ff"Tb4b4b4)
Tff7b72val Te6edf3differentDevice Tff7b72= Te6edf3usbDeviceTb4b4b4(Ta5d6ff"Ta5d6ff/dev/bus/usb/001/002Ta5d6ff"Tb4b4b4)
Tff7b72var Te6edf3platformHasPermission Tff7b72= Tff7b72false
Tff7b72val Te6edf3result Tff7b72=
Te6edf3asyncTb4b4b4(Te6edf3start Tff7b72= Te6edf3CoroutineStartTb4b4b4.Te6edf3UNDISPATCHEDTb4b4b4) Tb4b4b4{
Te6edf3usbPermissionResultFlowTb4b4b4(
Te6edf3context Tff7b72= Te6edf3contextTb4b4b4,
Te6edf3device Tff7b72= Te6edf3requestedDeviceTb4b4b4,
Te6edf3hasPermission Tff7b72= Tb4b4b4{ Te6edf3platformHasPermission Tb4b4b4}Tb4b4b4,
Te6edf3requestPermission Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3registration Tff7b72= Te6edf3usbPermissionRegistrationsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3singleTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3ContextCompatTb4b4b4.Te6edf3RECEIVER_NOT_EXPORTEDTb4b4b4, Te6edf3registrationTb4b4b4.Te6edf3flagsTb4b4b4)
Te6edf3registrationTb4b4b4.Te6edf3broadcastReceiverTb4b4b4.Te6edf3onReceiveTb4b4b4(
Te6edf3contextTb4b4b4,
Te6edf3permissionResultIntentTb4b4b4(Te6edf3registrationTb4b4b4.Te6edf3intentFilterTb4b4b4.Te6edf3getActionTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4, Te6edf3differentDeviceTb4b4b4, Tff7b72trueTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3registrationTb4b4b4.Te6edf3broadcastReceiverTb4b4b4.Te6edf3onReceiveTb4b4b4(
Te6edf3contextTb4b4b4,
Te6edf3permissionResultIntentTb4b4b4(Te6edf3registrationTb4b4b4.Te6edf3intentFilterTb4b4b4.Te6edf3getActionTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4, Te6edf3requestedDeviceTb4b4b4, Tff7b72trueTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`permission result requires the platform grant`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3requestedDevice Tff7b72= Te6edf3usbDeviceTb4b4b4(Ta5d6ff"Ta5d6ff/dev/bus/usb/001/003Ta5d6ff"Tb4b4b4)
Tff7b72var Te6edf3requestCalls Tff7b72= T79c0ff0
Tff7b72val Te6edf3result Tff7b72=
Te6edf3asyncTb4b4b4(Te6edf3start Tff7b72= Te6edf3CoroutineStartTb4b4b4.Te6edf3UNDISPATCHEDTb4b4b4) Tb4b4b4{
Te6edf3usbPermissionResultFlowTb4b4b4(
Te6edf3context Tff7b72= Te6edf3contextTb4b4b4,
Te6edf3device Tff7b72= Te6edf3requestedDeviceTb4b4b4,
Te6edf3hasPermission Tff7b72= Tb4b4b4{ Tff7b72true Tb4b4b4}Tb4b4b4,
Te6edf3requestPermission Tff7b72= Tb4b4b4{ Te6edf3requestCalls Tff7b72+Tff7b72= T79c0ff1 Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3requestCallsTb4b4b4)
Tff7b72val Te6edf3registration Tff7b72= Te6edf3usbPermissionRegistrationsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3singleTb4b4b4(Tb4b4b4)
Te6edf3registrationTb4b4b4.Te6edf3broadcastReceiverTb4b4b4.Te6edf3onReceiveTb4b4b4(
Te6edf3contextTb4b4b4,
Te6edf3permissionResultIntentTb4b4b4(Te6edf3registrationTb4b4b4.Te6edf3intentFilterTb4b4b4.Te6edf3getActionTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4, Te6edf3requestedDeviceTb4b4b4, Tff7b72trueTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`permission result rejects a broadcast grant when platform permission is absent`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3requestedDevice Tff7b72= Te6edf3usbDeviceTb4b4b4(Ta5d6ff"Ta5d6ff/dev/bus/usb/001/007Ta5d6ff"Tb4b4b4)
Tff7b72var Te6edf3requestCalls Tff7b72= T79c0ff0
Tff7b72val Te6edf3result Tff7b72=
Te6edf3asyncTb4b4b4(Te6edf3start Tff7b72= Te6edf3CoroutineStartTb4b4b4.Te6edf3UNDISPATCHEDTb4b4b4) Tb4b4b4{
Te6edf3usbPermissionResultFlowTb4b4b4(
Te6edf3context Tff7b72= Te6edf3contextTb4b4b4,
Te6edf3device Tff7b72= Te6edf3requestedDeviceTb4b4b4,
Te6edf3hasPermission Tff7b72= Tb4b4b4{ Tff7b72false Tb4b4b4}Tb4b4b4,
Te6edf3requestPermission Tff7b72= Tb4b4b4{ Te6edf3requestCalls Tff7b72+Tff7b72= T79c0ff1 Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3requestCallsTb4b4b4)
Tff7b72val Te6edf3registration Tff7b72= Te6edf3usbPermissionRegistrationsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3singleTb4b4b4(Tb4b4b4)
Te6edf3registrationTb4b4b4.Te6edf3broadcastReceiverTb4b4b4.Te6edf3onReceiveTb4b4b4(
Te6edf3contextTb4b4b4,
Te6edf3permissionResultIntentTb4b4b4(Te6edf3registrationTb4b4b4.Te6edf3intentFilterTb4b4b4.Te6edf3getActionTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4, Te6edf3requestedDeviceTb4b4b4, Tff7b72trueTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`permission result without a device is denied and completes`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3requestedDevice Tff7b72= Te6edf3usbDeviceTb4b4b4(Ta5d6ff"Ta5d6ff/dev/bus/usb/001/006Ta5d6ff"Tb4b4b4)
Tff7b72var Te6edf3platformPermissionChecked Tff7b72= Tff7b72false
Tff7b72val Te6edf3result Tff7b72=
Te6edf3asyncTb4b4b4(Te6edf3start Tff7b72= Te6edf3CoroutineStartTb4b4b4.Te6edf3UNDISPATCHEDTb4b4b4) Tb4b4b4{
Te6edf3usbPermissionResultFlowTb4b4b4(
Te6edf3context Tff7b72= Te6edf3contextTb4b4b4,
Te6edf3device Tff7b72= Te6edf3requestedDeviceTb4b4b4,
Te6edf3hasPermission Tff7b72= Tb4b4b4{
Te6edf3platformPermissionChecked Tff7b72= Tff7b72true
Tff7b72true
Tb4b4b4}Tb4b4b4,
Te6edf3requestPermission Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3registration Tff7b72= Te6edf3usbPermissionRegistrationsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3singleTb4b4b4(Tb4b4b4)
Te6edf3registrationTb4b4b4.Te6edf3broadcastReceiverTb4b4b4.Te6edf3onReceiveTb4b4b4(
Te6edf3contextTb4b4b4,
Te6edf3IntentTb4b4b4(Te6edf3registrationTb4b4b4.Te6edf3intentFilterTb4b4b4.Te6edf3getActionTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3setPackageTb4b4b4(Te6edf3contextTb4b4b4.Te6edf3packageNameTb4b4b4)
Tb4b4b4.Te6edf3putExtraTb4b4b4(Te6edf3UsbManagerTb4b4b4.Te6edf3EXTRA_PERMISSION_GRANTEDTb4b4b4, Tff7b72trueTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3platformPermissionCheckedTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3usbPermissionRegistrationsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`concurrent requests consume only their own device result`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3firstDevice Tff7b72= Te6edf3usbDeviceTb4b4b4(Ta5d6ff"Ta5d6ff/dev/bus/usb/001/004Ta5d6ff"Tb4b4b4)
Tff7b72val Te6edf3secondDevice Tff7b72= Te6edf3usbDeviceTb4b4b4(Ta5d6ff"Ta5d6ff/dev/bus/usb/001/005Ta5d6ff"Tb4b4b4)
Tff7b72val Te6edf3firstResult Tff7b72=
Te6edf3asyncTb4b4b4(Te6edf3start Tff7b72= Te6edf3CoroutineStartTb4b4b4.Te6edf3UNDISPATCHEDTb4b4b4) Tb4b4b4{
Te6edf3usbPermissionResultFlowTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3firstDeviceTb4b4b4, Te6edf3hasPermission Tff7b72= Tb4b4b4{ Tff7b72true Tb4b4b4}Tb4b4b4, Te6edf3requestPermission Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3secondResult Tff7b72=
Te6edf3asyncTb4b4b4(Te6edf3start Tff7b72= Te6edf3CoroutineStartTb4b4b4.Te6edf3UNDISPATCHEDTb4b4b4) Tb4b4b4{
Te6edf3usbPermissionResultFlowTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3secondDeviceTb4b4b4, Te6edf3hasPermission Tff7b72= Tb4b4b4{ Tff7b72true Tb4b4b4}Tb4b4b4, Te6edf3requestPermission Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3action Tff7b72= Te6edf3usbPermissionRegistrationsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3intentFilterTb4b4b4.Te6edf3getActionTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3dispatchPermissionResultTb4b4b4(Te6edf3actionTb4b4b4, Te6edf3firstDeviceTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3firstResultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3secondResultTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3dispatchPermissionResultTb4b4b4(Te6edf3actionTb4b4b4, Te6edf3secondDeviceTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3secondResultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffpermissionResultIntentTb4b4b4(Te6edf3actionTb4b4b4: Tffa657StringTb4b4b4, Te6edf3deviceTb4b4b4: Te6edf3UsbDeviceTb4b4b4, Te6edf3grantedTb4b4b4: Tffa657BooleanTb4b4b4)Tb4b4b4: Te6edf3Intent Tff7b72= Te6edf3IntentTb4b4b4(Te6edf3actionTb4b4b4)
Tb4b4b4.Te6edf3setPackageTb4b4b4(Te6edf3contextTb4b4b4.Te6edf3packageNameTb4b4b4)
Tb4b4b4.Te6edf3putExtraTb4b4b4(Te6edf3UsbManagerTb4b4b4.Te6edf3EXTRA_DEVICETb4b4b4, Te6edf3deviceTb4b4b4)
Tb4b4b4.Te6edf3putExtraTb4b4b4(Te6edf3UsbManagerTb4b4b4.Te6edf3EXTRA_PERMISSION_GRANTEDTb4b4b4, Te6edf3grantedTb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffdispatchPermissionResultTb4b4b4(Te6edf3actionTb4b4b4: Tffa657StringTb4b4b4, Te6edf3deviceTb4b4b4: Te6edf3UsbDeviceTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3intent Tff7b72= Te6edf3permissionResultIntentTb4b4b4(Te6edf3actionTb4b4b4, Te6edf3deviceTb4b4b4, Tff7b72trueTb4b4b4)
Te6edf3usbPermissionRegistrationsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3registration Tff7b72-Tff7b72>
Te6edf3registrationTb4b4b4.Te6edf3broadcastReceiverTb4b4b4.Te6edf3onReceiveTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3intentTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffusbPermissionRegistrationsTb4b4b4(Tb4b4b4) Tff7b72=
Te6edf3shadowOfTb4b4b4(Te6edf3contextTb4b4b4.Te6edf3applicationContext Tff7b72as Te6edf3ApplicationTb4b4b4)Tb4b4b4.Te6edf3registeredReceiversTb4b4b4.Te6edf3filter Tb4b4b4{
Tffa657itTb4b4b4.Te6edf3intentFilterTb4b4b4.Te6edf3hasActionTb4b4b4(Te6edf3ACTION_USB_PERMISSIONTb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffusbDeviceTb4b4b4(Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3UsbDevice Tff7b72=
Te6edf3ShadowTb4b4b4.Te6edf3newInstanceOfTb4b4b4(Te6edf3UsbDeviceTff7b72::Te6edf3classTb4b4b4.Te6edf3javaTb4b4b4)Tb4b4b4.Te6edf3also Tb4b4b4{ Te6edf3ReflectionHelpersTb4b4b4.Te6edf3setFieldTb4b4b4(Tffa657itTb4b4b4, Ta5d6ff"Ta5d6ffmNameTa5d6ff"Tb4b4b4, Te6edf3nameTb4b4b4) Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.09s